#ifndef SOUND_SOUNDOUTPUTSTREAMINTERFACE_H_
#define SOUND_SOUNDOUTPUTSTREAMINTERFACE_H_

#include "base/constructormagic.h"
#include "base/sigslot.h"

namespace cricket {

	// Interface for outputting a stream to a playback device.
	// Semantics and thread-safety of EnableBufferMonitoring()/
	// DisableBufferMonitoring() are the same as for base::Worker.
	class SoundOutputStreamInterface {
	public:
		virtual ~SoundOutputStreamInterface() {}

		// Enables monitoring the available buffer space on the current thread.
		virtual bool EnableBufferMonitoring() = 0;
		// Disables the monitoring.
		virtual bool DisableBufferMonitoring() = 0;

		// Write the given samples to the devices. If currently monitoring then this
		// may only be called from the monitoring thread.
		virtual bool WriteSamples(const void *sample_data,
			size_t size) = 0;

		// Retrieves the current output volume for this stream. Nominal range is
		// defined by SoundSystemInterface::k(Max|Min)Volume, but values exceeding the
		// max may be possible in some implementations. This call retrieves the actual
		// volume currently in use by the OS, not a cached value from a previous
		// (Get|Set)Volume() call.
		virtual bool GetVolume(int *volume) = 0;

		// Changes the output volume for this stream. Nominal range is defined by
		// SoundSystemInterface::k(Max|Min)Volume. The effect of exceeding kMaxVolume
		// is implementation-defined.
		virtual bool SetVolume(int volume) = 0;

		// Closes this stream object. If currently monitoring then this may only be
		// called from the monitoring thread.
		virtual bool Close() = 0;

		// Get the latency of the stream.
		virtual int LatencyUsecs() = 0;

		// Notifies the producer of the available buffer space for writes.
		// It fires continuously as long as the space is greater than zero.
		// The first parameter is the amount of buffer space available for data to
		// be written (i.e., the maximum amount of data that can be written right now
		// with WriteSamples() without blocking).
		// The 2nd parameter is the stream that is issuing the callback.
		sigslot::signal2<size_t, SoundOutputStreamInterface *> SignalBufferSpace;

	protected:
		SoundOutputStreamInterface() {}

	private:
		DISALLOW_COPY_AND_ASSIGN(SoundOutputStreamInterface);
	};

}  // namespace cricket

#endif  // SOUND_SOUNDOUTPUTSTREAMINTERFACE_H_
